/**
 * System:      oshys
 * Model:       log
 * Licence:     GNU General Public License v3
 * Author:      sunwl
 * Date:        2010/02/19
 */
package org.oshys.util.logging;

/**
 * Appender虚类,扩展的Appender应该自定义实现append方法.
 * @author sunwl
 */
public abstract class Appender implements IAppender {
    // 格式化器
    IFormatter formatter = null;
    // 过滤器链,可以为其加入多个过滤器,并在输出Log的过程中一一过滤.
    FilterChain<IFilter> filterChain = new FilterChain<IFilter>();
    /**
     * 输出一条Log的主要方法。<br>
     * 需自定义输出目标,模式等.
     * @param 一个LogMessage实例
     */
    public abstract void append (LogMessage logMessage);

    /**
     * 为当前Appender设定一个格式化器。<br>
     * 一般的,这个格式化器是用来格式化待输出的LogMessage实例的。
     */
    public void setFormatter(IFormatter formatter) {
        this.formatter = formatter;
    }
    
    /**
     * 判定参数中的LogMessage是否应该被输出为Log。<br>
     * 通过添加到过滤器链中的过滤器来判断是否输出,只有通过了过滤器链中所有过滤器的过滤才会返回True(才会被输出)。
     * @param logMessage
     * @return
     */
    protected boolean toAppend(LogMessage logMessage){
        for(IFilter filter : this.filterChain){
            if(!filter.isLoggable(logMessage)){
                return false;
            }
        }
        return true;
    }
    
    /**
     * 向过滤器链中加入一个新的过滤器。
     */
    public void addFilter (IFilter val) {
        this.filterChain.add(val);
    }
}
